#ifndef SOLVEUR_H
#define SOLVEUR_H

/** Fichier qui définit une classe permettant de résoudre algébriquement des
 * équations de degré 1 à 4.
 *
 * Le fichier contient la classe Solveur, qui peut résoudre exactement des
 * équations de degré inférieur ou égal à 4.
 *
 * @file Solveur.hpp
 * @author Johan "Solo" Luisier
 *
 * @date 2009
 */

#include <vector>

/**
 * Classe permettant de résoudre \b algébriquement des équations de
 * degré 1 à 4. L'interface ne change pas selon de degré.
 *
 * @author Johan "Solo" Luisier
 *
 * @date 2009
 *
 * @class Solveur "Solveur.hpp" "Algebre/Solveur.hpp"
 */
class Solveur
{
public:
    Solveur( const double& p0 = 0., const double& p1 = 0., const double& p2 = 0.,
             const double& p3 = 0., const double& p4 = 0. );
    ~Solveur();
    void setParams( const double& p0 = 0., const double& p1 = 0.,
                    const double& p2 = 0., const double& p3 = 0.,
                    const double& p4 = 0. );
    void resoud( std::vector< double >& solution );
protected:
    double a0, /**< Terme constant. */
    a1, /**< Terme linéraire. */
    a2, /**< Terme quadratique. */
    a3, /**< Terme cubique. */
    a4; /**< Terme quartique. */
    void resoudDegre1( std::vector< double >& solution );
    void resoudDegre2( std::vector< double >& solution );
    void resoudDegre3( std::vector< double >& solution );
    void resoudDegre4( std::vector< double >& solution );
    double trouveRacine( const double& carre ) const;
};

#endif // SOLVEUR_H
